package br.com.cs.controller;

import br.com.cs.dao.jdbc.LancamentoJDBC;
import br.com.cs.exception.DAOException;
import br.com.cs.exception.PojoException;
import br.com.cs.model.Lancamento;
import br.com.cs.pojo.impl.LancamentoPojoImpl;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.ListDataModel;
import javax.faces.validator.ValidatorException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

@ManagedBean(name = "lancamentoMB")
@RequestScoped
public class LancamentoMB extends AbstractController implements Serializable {
    private ListDataModel lancamentos;
    private Lancamento lancamento;
    private Date data;
    private String filterName;
    private String filterValue;
    private List<Lancamento> listaLancamentos = new ArrayList<Lancamento>();
    
    public LancamentoMB() {
        lancamento = new Lancamento();
    }


    public void setLancamentos(ListDataModel lancamentos) {
        this.lancamentos = lancamentos;
    }

    public Lancamento getLancamento() {
        return lancamento;
    }

    public void setLancamento(Lancamento lancamento) {
        this.lancamento = lancamento;
    }

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public String getFilterName() {
        return filterName;
    }

    public void setFilterName(String filterName) {
        this.filterName = filterName;
    }

    public String getFilterValue() {
        return filterValue;
    }

    public void setFilterValue(String filterValue) {
        this.filterValue = filterValue;
    }

    public List<Lancamento> getListaLancamentos() {
        return listaLancamentos;
    }

    public void setListaLancamentos(List<Lancamento> listaLancamentos) {
        this.listaLancamentos = listaLancamentos;
    }
    
    public ListDataModel getLancamentos(){
        try {
            if (lancamentos != null) {
                return lancamentos;
            } else {
                List lancamentoList = LancamentoPojoImpl.getInstance().getAll();
                lancamentos = new ListDataModel(lancamentoList);
                return lancamentos;
            }
        } catch (PojoException e) {
            addError(null, e.getSummaryMessage(), e.getDetailsMessage());
            return null;
        }
    }

    public String salvar() throws PojoException, DAOException {

        try {
            if (null != this.lancamento.getId()) {
                LancamentoPojoImpl.getInstance().save(lancamento);
                addInfo(null, "Informação! ERRO", "Lancamento atualizada com sucesso");
                return "TipoLancamento";
            } else {
                LancamentoJDBC.getInstance().save(lancamento);
                addInfo(null, "Informação! OK", "Lancamento adicionada com sucesso");
                return "tipoLancamento";
            }

        } catch (PojoException e) {
            addError(null, e.getSummaryMessage(), e.getDetailsMessage());
            return "tipoLancamento";
        }

    }

    public String criarNovo() {
        this.lancamento = new Lancamento();
        return "tipoLancamento";
    }

    public String editar() {
        this.lancamento = (Lancamento) lancamentos.getRowData();
        return "tipoLancamento";
    }

    public String remover() {
        lancamento = (Lancamento) lancamentos.getRowData();
        try {
            LancamentoPojoImpl.getInstance().delete(lancamento);
            addInfo(null, "Informação! ", "Lancamento removido com sucesso");
            lancamentos = null;
            return "tipoLancamento";
        } catch (PojoException e) {
            addError(null, e.getSummaryMessage(), e.getDetailsMessage());
            return "tipoLancamento";
        }
    }


    public String filtrar() {
        try {
            if (this.filterValue == null || "".equals(this.filterValue.trim())) {
                lancamentos = null;
            } else {
                List lancamentosList = LancamentoPojoImpl.getInstance().getByFilter(this.filterName.trim(), this.filterValue.trim());
                lancamentos = new ListDataModel(lancamentosList);
            }
        } catch (PojoException e) {
            addError(null, e.getSummaryMessage(), e.getDetailsMessage());
            return null;
        }
        return "tipoLancamento";
    }
    
}
